import axios from 'axios'
import router from "@/router";
import { getToken, isLoggedIn } from './auth'
import { API_CONFIG } from '@/api/config'

const request = axios.create({
    baseURL: API_CONFIG.BASE_URL,
    timeout: 30000
})
// 请求白名单，如果请求在白名单里面，将不会被拦截校验权限
const whiteUrls = [
    "/login",
    '/register',
    '/api/region/provinces', '/api/region/cities/*', '/api/region/districts/*',
    // 允许未登录加载点赞/收藏统计（GET），不包含写操作
    '/api/job/likes/*', '/api/job/favorites/*'
]

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {
    // 检查是否在白名单中（支持动态路径匹配）
    const isWhitelisted = whiteUrls.some(url => {
        if (url.includes('*')) {
            // 支持通配符匹配
            const pattern = url.replace(/\*/g, '.*');
            return new RegExp(pattern).test(config.url);
        } else {
            return config.url.startsWith(url);
        }
    });
    
    if (!isWhitelisted) {  // 校验请求白名单
        if(!isLoggedIn()) {
            router.push("/login")
        } else {
            const token = getToken();
            config.headers['Authorization'] = `Bearer ${token}`;  // 设置请求头
        }
    }
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        console.log('响应拦截器收到数据:', res);
        
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        // 验证token - 使用数字比较而不是字符串比较
        if (res.code === 401) {
            console.error("token过期，重新登录")
            router.push("/login")
        }
        return res;
    },
    error => {
        console.log('响应拦截器错误:', error) // for debug
        try{
            const status = error?.response?.status
            if (status === 401){
                router.push('/login')
            }
        }catch(e){ /* ignore */ }
        return Promise.reject(error)
    }
)

export default request
